/* 
 * File:   graph.h
 * Author: fruti
 *
 * Created on 20 de enero de 2014, 06:38 PM
 */

#ifndef graph_H
#define	graph_H

#include <iostream>
#include <fstream>
#include <list>
#include <vector>
#include <string>
#include "Path.h"

using namespace std;

class Graph {
public:
    int ** Aristas;
    float ** Costos;
    int* Terminales; // Nodos terminales

    int tamanioG;
    int diametro;


    /**
     * Constructor por defecto, no es util
     */
    Graph();

    /**
     * creo un grafo en base a la cantidad de nodos
     * @param cantNodos
     */
    Graph(int cantNodos);

    /**
     * crea un grafo en base a un archivo 
     * @param file_path
     */
    Graph(const char* file_path); // leo de la entrada el grafo.
    Graph(Graph* G);

    //terminales


    //aristas
    void agregarArista(int nodo1, int nodo2, float costo);
    void quitarArista(int nodo1, int nodo2);
    bool existeArista(int u, int v);

    //tamanio
    int getTamanio();
    void setTamanio(int tamanio);

    //nodo 
    int obtenerGradoNodo(int nodo);
    bool esNodoTerminal(int nodo);

    list<int> * obtenerVecinos(int nodo);
    list<int> * obtenerVecinosCandidatos(int node, list<int> * candidates); // retorna todos los vecinos de "node" que se encuntran en la lista "candidates"
    int costo();




    ~Graph();

    void setCostos(float** Costos);
    float** getCostos() const;
    void setAristas(int** Aristas);
    int** getAristas() const;

    /**
     * Imprime el grafo en el formato dot de graphviz
     */
    void graph_viz();
    void setTerminales(int* Terminales);
    int* getTerminales() const;

};
#endif	/* GRAPH_H */

